/*
 * FrmInloggen.java
 *
 * Created on 29 februari 2008, 14:15
 */
package client.gui;

import client.communication.*;
import java.awt.*;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import javax.swing.*;
import org.apache.log4j.Logger;
import data.Gebruiker;

/**
 * De klasse Login is een extensie van een JFrame. Deze frame zal
 * de gebruiker vragen om een loginnaam en een paswoord in te geven.
 * Aan de hand van deze gegevens zal er geprobeerd worden om de gebruiker
 * in te loggen op de chatserver.
 * @author 
 */
public class Login extends javax.swing.JFrame {

    private Logger logger = Logger.getLogger(Login.class);
    private InetAddress host;
    private int port;
    private String ip;
    private boolean connected = false;
    private String login,  paswoord;
    private Gebruiker gebruiker = null;
    private Registreer rfrm = null;

    /**
     * Class constructor die zal beginnen met het aanmaken van de GUI en een
     * communicatie object aanmaakt.
     */
    public Login() {
        initComponents();

        txtLogin.requestFocus();
        
        try {
            txtServer.setText(InetAddress.getLocalHost().getHostAddress());
            //ip = JOptionPane.showInputDialog("Geef IP-adres van server op: ", InetAddress.getLocalHost().getHostAddress());
            //String p = JOptionPane.showInputDialog("Geef poortnummer van serverapplicatie op: ","1234");

            // Communicatie object aanmaken dit object wordt naar alle forms en klassen van deze speler doorgegeven
            ClientCommunication.getInstance().setFrmInlog(this);
        } catch (UnknownHostException uhe) {
            logger.error("Unknown host!");
            logger.error(uhe.getMessage());
        }
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jTabbedPane1 = new javax.swing.JTabbedPane();
        jPanel1 = new javax.swing.JPanel();
        txtLogin = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        txtPaswoord = new javax.swing.JPasswordField();
        jLabel3 = new javax.swing.JLabel();
        btnRegistreer = new javax.swing.JButton();
        btnLogin = new javax.swing.JButton();
        helpLinkLabel1 = new client.gui.controls.HelpLinkLabel();
        jPanel2 = new javax.swing.JPanel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        txtServer = new javax.swing.JTextField();
        txtPoort = new javax.swing.JTextField();
        helpLinkLabel2 = new client.gui.controls.HelpLinkLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Inloggen");
        setResizable(false);

        jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());

        jLabel1.setText("Login:");

        jLabel2.setText("Paswoord:");

        txtPaswoord.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txtPaswoordKeyPressed(evt);
            }
        });

        jLabel3.setText("Ben je nog geen lid? Registreer dan eerst.");

        btnRegistreer.setText("Registreer");
        btnRegistreer.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                registreer(evt);
            }
        });

        btnLogin.setText("Login");
        btnLogin.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                inloggen(evt);
            }
        });

        org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel1Layout.createSequentialGroup()
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jPanel1Layout.createSequentialGroup()
                        .addContainerGap()
                        .add(jLabel3)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(btnRegistreer))
                    .add(jPanel1Layout.createSequentialGroup()
                        .add(66, 66, 66)
                        .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                            .add(jLabel1)
                            .add(jLabel2))
                        .add(13, 13, 13)
                        .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
                            .add(txtPaswoord)
                            .add(txtLogin, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 108, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
                    .add(jPanel1Layout.createSequentialGroup()
                        .add(104, 104, 104)
                        .add(btnLogin)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 117, Short.MAX_VALUE)
                        .add(helpLinkLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel3)
                    .add(btnRegistreer))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel1)
                    .add(txtLogin, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(txtPaswoord, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(jLabel2))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(btnLogin)
                    .add(helpLinkLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jTabbedPane1.addTab("Inloggen", jPanel1);

        jLabel4.setText("Server IP:");

        jLabel5.setText("Poort:");

        txtPoort.setText("1234");

        org.jdesktop.layout.GroupLayout jPanel2Layout = new org.jdesktop.layout.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel2Layout.createSequentialGroup()
                .add(78, 78, 78)
                .add(jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jLabel4)
                    .add(jLabel5))
                .add(10, 10, 10)
                .add(jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
                    .add(txtPoort)
                    .add(txtServer, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 98, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(78, Short.MAX_VALUE))
            .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel2Layout.createSequentialGroup()
                .addContainerGap(282, Short.MAX_VALUE)
                .add(helpLinkLabel2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel2Layout.createSequentialGroup()
                .add(35, 35, 35)
                .add(jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(txtServer, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(jLabel4))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel5)
                    .add(txtPoort, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .add(18, 18, 18)
                .add(helpLinkLabel2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(17, Short.MAX_VALUE))
        );

        jTabbedPane1.addTab("Server details", jPanel2);

        getContentPane().add(jTabbedPane1, java.awt.BorderLayout.CENTER);

        pack();
    }// </editor-fold>//GEN-END:initComponents
    /**
     * Functie die nagaat of beide velden van het login frame ingevuld zijn
     * Indien goed ingevuld zal er geprobeerd worden om een connectie met de
     * server te maken
     * @param evt ActionEvent
     */
    private void inloggen(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_inloggen
        inloggen(); 
    }//GEN-LAST:event_inloggen

    private void inloggen() {
        //checken of beide velden ingevuld zijn
        ip = txtServer.getText();
        String p = txtPoort.getText();

        try {
            port = Integer.parseInt(p);

            if (txtLogin.getText().equals("") || new String(txtPaswoord.getPassword()).equals("")) {
                JOptionPane.showMessageDialog(this, "Gelieve alle velden in te vullen!");
            } else {
                login = txtLogin.getText();
                paswoord = new String(txtPaswoord.getPassword());
                boolean gelukt = false;
                if (connected == false) {
                    gelukt = ClientCommunication.getInstance().makeConnection(ip, port);
                }

                if (gelukt) {
                    ClientCommunication.getInstance().spelerAlOnline(login);
                    btnLogin.setEnabled(false);
                    btnRegistreer.setEnabled(false);
                }

            }
        } catch (NumberFormatException ex) {
            JOptionPane.showMessageDialog(this, "Foutief poortnummer");
        }
    }

    //functie die aangeroepen wordt door de communication klasse
    //Wanneer de de parameter true is betekent het dat de speler die wil inloggen reeds ingelogd is
    /**
     * Functie die aangeroepen wordt door de communication klasse. Deze fuctie
     * zal een boolean terug geven die weergeeft of een gebruiker al online is
     * of niet.
     * @param online Boolean die weergeeft of speler reeds ingelogd is.
     */
    public void inloggen(boolean online) {
        if (online == false) {

            try {
                //player ophalen aan de hand van login en paswoord
                ClientCommunication.getInstance().getSpelerByLogin(login, paswoord);
            } catch (IOException ex) {
                logger.error(ex.getMessage());
            }
        } else {
            JOptionPane.showMessageDialog(this, "Je bent al ingelogd");
            btnLogin.setEnabled(true);
            btnRegistreer.setEnabled(true);
        }
    }

    /**
     * Functie die pas wordt opgeroepen na het instellen van de gegevens door
     * de communicatie klasse. Aan de hand van deze gegevens kunnen we de 
     * gebruiker updaten.
     */
    public void verderInloggen() {
        //de communicatie klasse stelt voor hij deze functie oproept de Gebruiker in
        //aan de hand van die gegevens kunnen we dan de speler updaten
        logger.info("verder inloggen");
        try {
            if (getGebruiker() == null) {
                //als speler niet bestaat => foutmelding
                JOptionPane.showMessageDialog(this, "De login en/of paswoord zijn verkeerd!");
                btnLogin.setEnabled(true);
                btnRegistreer.setEnabled(true);
            } else {
                getGebruiker().setOnline(true);
                getGebruiker().setGaming(false);
                ClientCommunication.getInstance().updateSpeler(getGebruiker());
                ClientCommunication.getInstance().spelerOnline(getGebruiker().getNickname());

                Chatroom opstart = new Chatroom(getGebruiker());
                ClientCommunication.getInstance().setChatroom(opstart);
                //grootte
                opstart.pack();
                //positie
                opstart.setLocationRelativeTo(null);
                opstart.setVisible(true);
                opstart.toFront();
                opstart.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);

                this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                this.setVisible(false);
            }
        } catch (ClassNotFoundException ex) {
            logger.error(ex.getMessage());
        } catch (IOException ex) {
            logger.error(ex.getMessage());
        } catch (Exception ex) {
            logger.error(ex.getMessage());
        }

    }

    /**
     * Functie die een foutboodschap weergeeft als een dialog. Wordt opgeroepen
     * als er zich een fout voordoet.
     * @param bericht Het te verzenden bericht
     */
    public void foutboodschap(String bericht) {
        //fout wanneer er geen connectie kan gemaakt worden met de server
        JOptionPane.showMessageDialog(this, bericht);
    }

    /**
     * Functie die waarneemt als de gebruiker wilt registreren.
     * @param evt ActionEvent die waarneemt als er op de knop "registreer"
     *            geklikt wordt.
     */
    private void registreer(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_registreer
// TODO add your handling code here:
        ip = txtServer.getText();
        String p = txtPoort.getText();

        try {
            port = Integer.parseInt(p);

            //Registreer formulier opstarten
            JFrame frame = new JFrame("Registreer");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            rfrm = new Registreer(ip, port, frame);
            if(frame.isEnabled()){
                frame.setResizable(false);
                //registreerpaneel aan frame toevoegen
                frame.add(getRfrm());

                //venster weergeven
                frame.pack();
                frame.setVisible(true);
            }else{
                frame.dispose();
            }
        } catch (NumberFormatException ex) {
            JOptionPane.showMessageDialog(this, "Foutief poortnummer");
        }
    }//GEN-LAST:event_registreer

    private void txtPaswoordKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtPaswoordKeyPressed
        // TODO add your handling code here:
        //wanneer er op enter geduwd wordt, inloggen
        if (evt.getKeyCode() == 10) {
            inloggen();
        }
    }//GEN-LAST:event_txtPaswoordKeyPressed

    /**
     * Functie main die het loginvenster opstart
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                Login inloggen = new Login();

                //grootte
                inloggen.pack();
                //positie
                inloggen.setLocationRelativeTo(null);

                inloggen.setVisible(true);
                inloggen.toFront();
            }
        });
    }

    /**
     * Functie die de gebruiker teruggeeft.
     * @return Gebruiker
     */
    public Gebruiker getGebruiker() {
        return gebruiker;
    }

    /**
     * Functie die het mogelijk maakt om de gebruiker in te stellen
     * @param gebruiker Gebruiker instellen.
     */
    public void setGebruiker(Gebruiker gebruiker) {
        this.gebruiker = gebruiker;
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnLogin;
    private javax.swing.JButton btnRegistreer;
    private client.gui.controls.HelpLinkLabel helpLinkLabel1;
    private client.gui.controls.HelpLinkLabel helpLinkLabel2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JTextField txtLogin;
    private javax.swing.JPasswordField txtPaswoord;
    private javax.swing.JTextField txtPoort;
    private javax.swing.JTextField txtServer;
    // End of variables declaration//GEN-END:variables
    public Registreer getRfrm() {
        return rfrm;
    }
}

